Add a test for ::row-changed vs node refs
authorMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jan 2018 15:02:42 +0000 (16:02 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jan 2018 20:29:13 +0000 (23:29 +0300)
Test that filter models propagate ::row-changed if there is
an external reference on the node, and not otherwise. This
is showing up in buggy icon view behaviour, where the icon
view is not redrawing if the content changes in a model that
is below a filter model.

testsuite/gtk/filtermodel.c

index c54430b53b63653be30fb907a043a33b20bb0123..ce0defacf58ed7d80dd3e9594cb52c8b4b04e012 100644 (file)
@@ -6755,6 +6755,75 @@ specific_bug_679910 (void)
   g_object_unref (store);
 }
 
+static int row_changed_count;
+static int filter_row_changed_count;
+
+static void
+row_changed (GtkTreeModel *model,
+             GtkTreePath  *path,
+             GtkTreeIter  *iter,
+             gpointer data)
+{
+  int *count = data;
+
+  (*count)++;
+}
+
+static void
+test_row_changed (void)
+{
+  GtkTreeModel *filter;
+  GtkListStore *store;
+  GtkTreeIter iter1, iter2, iter3;
+  GtkTreeIter fiter1, fiter2, fiter3;
+
+  store = gtk_list_store_new (1, G_TYPE_INT);
+  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+
+  gtk_list_store_append (store, &iter1);
+  gtk_list_store_append (store, &iter2);
+  gtk_list_store_append (store, &iter3);
+
+  gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter1, &iter1);
+  gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter2, &iter2);
+  gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter3, &iter3);
+
+  g_signal_connect (store, "row-changed", G_CALLBACK (row_changed), &row_changed_count);
+  g_signal_connect (filter, "row-changed", G_CALLBACK (row_changed), &filter_row_changed_count);
+
+  row_changed_count = 0;
+  filter_row_changed_count = 0;
+
+  gtk_list_store_set (store, &iter1, 0, 1, -1);
+  gtk_list_store_set (store, &iter2, 0, 1, -1);
+  gtk_list_store_set (store, &iter3, 0, 1, -1);
+
+  g_assert (row_changed_count == 3);
+  g_assert (filter_row_changed_count == 0);
+
+  row_changed_count = 0;
+  filter_row_changed_count = 0;
+
+  gtk_tree_model_ref_node (filter, &fiter1);
+  gtk_tree_model_ref_node (filter, &fiter2);
+  gtk_tree_model_ref_node (filter, &fiter3);
+
+  gtk_list_store_set (store, &iter1, 0, 2, -1);
+  gtk_list_store_set (store, &iter2, 0, 2, -1);
+  gtk_list_store_set (store, &iter3, 0, 2, -1);
+
+  g_assert (row_changed_count == 3);
+  g_assert (filter_row_changed_count == 3);
+
+  gtk_tree_model_unref_node (filter, &fiter1);
+  gtk_tree_model_unref_node (filter, &fiter2);
+  gtk_tree_model_unref_node (filter, &fiter3);
+
+  g_object_unref (filter);
+  g_object_unref (store);
+}
+
+
 /* main */
 
 void
@@ -7116,4 +7185,6 @@ register_filter_model_tests (void)
                    specific_bug_659022_row_deleted_free_level);
   g_test_add_func ("/TreeModelFilter/specific/bug-679910",
                    specific_bug_679910);
+
+  g_test_add_func ("/TreeModelFilter/signal/row-changed", test_row_changed);
 }